/**
 * Copyright (c) 2006-2015, JGraph Ltd
 * Copyright (c) 2006-2015, Gaudenz Alder
 */
/**
 * Class: mxForm
 *
 * A simple class for creating HTML forms.
 *
 * Constructor: mxForm
 *
 * Creates a HTML table using the specified classname.
 */
function mxForm(className) {
  this.table = document.createElement("table");
  this.table.className = className;
  this.body = document.createElement("tbody");

  this.table.appendChild(this.body);
}

/**
 * Variable: table
 *
 * Holds the DOM node that represents the table.
 */
mxForm.prototype.table = null;

/**
 * Variable: body
 *
 * Holds the DOM node that represents the tbody (table body). New rows
 * can be added to this object using DOM API.
 */
mxForm.prototype.body = false;

/**
 * Function: getTable
 *
 * Returns the table that contains this form.
 */
mxForm.prototype.getTable = function () {
  return this.table;
};

/**
 * Function: addButtons
 *
 * Helper method to add an OK and Cancel button using the respective
 * functions.
 */
mxForm.prototype.addButtons = function (okFunct, cancelFunct) {
  var tr = document.createElement("tr");
  var td = document.createElement("td");
  tr.appendChild(td);
  td = document.createElement("td");

  // Adds the ok button
  var button = document.createElement("button");
  mxUtils.write(button, mxResources.get("ok") || "OK");
  td.appendChild(button);

  mxEvent.addListener(button, "click", function () {
    okFunct();
  });

  // Adds the cancel button
  button = document.createElement("button");
  mxUtils.write(button, mxResources.get("cancel") || "Cancel");
  td.appendChild(button);

  mxEvent.addListener(button, "click", function () {
    cancelFunct();
  });

  tr.appendChild(td);
  this.body.appendChild(tr);
};

/**
 * Function: addText
 *
 * Adds an input for the given name, type and value and returns it.
 */
mxForm.prototype.addText = function (name, value, type) {
  var input = document.createElement("input");

  input.setAttribute("type", type || "text");
  input.value = value;

  return this.addField(name, input);
};

/**
 * Function: addCheckbox
 *
 * Adds a checkbox for the given name and value and returns the textfield.
 */
mxForm.prototype.addCheckbox = function (name, value) {
  var input = document.createElement("input");

  input.setAttribute("type", "checkbox");
  this.addField(name, input);

  // IE can only change the checked value if the input is inside the DOM
  if (value) {
    input.checked = true;
  }

  return input;
};

/**
 * Function: addTextarea
 *
 * Adds a textarea for the given name and value and returns the textarea.
 */
mxForm.prototype.addTextarea = function (name, value, rows) {
  var input = document.createElement("textarea");

  if (mxClient.IS_NS) {
    rows--;
  }

  input.setAttribute("rows", rows || 2);
  input.value = value;

  return this.addField(name, input);
};

/**
 * Function: addCombo
 *
 * Adds a combo for the given name and returns the combo.
 */
mxForm.prototype.addCombo = function (name, isMultiSelect, size) {
  var select = document.createElement("select");

  if (size != null) {
    select.setAttribute("size", size);
  }

  if (isMultiSelect) {
    select.setAttribute("multiple", "true");
  }

  return this.addField(name, select);
};

/**
 * Function: addOption
 *
 * Adds an option for the given label to the specified combo.
 */
mxForm.prototype.addOption = function (combo, label, value, isSelected) {
  var option = document.createElement("option");

  mxUtils.writeln(option, label);
  option.setAttribute("value", value);

  if (isSelected) {
    option.setAttribute("selected", isSelected);
  }

  combo.appendChild(option);
};

/**
 * Function: addField
 *
 * Adds a new row with the name and the input field in two columns and
 * returns the given input.
 */
mxForm.prototype.addField = function (name, input) {
  var tr = document.createElement("tr");
  var td = document.createElement("td");
  mxUtils.write(td, name);
  tr.appendChild(td);

  td = document.createElement("td");
  td.appendChild(input);
  tr.appendChild(td);
  this.body.appendChild(tr);

  return input;
};
